package cn.yunyichina.utils.commons;

import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
 * Created by Joe.zhou on 2017/8/22.
 */
public class MobileUtil {

    /** 电话格式验证 **/
    private static final String PHONE_CALL_PATTERN = "^(\\(\\d{3,4}\\)|\\d{3,4}-)?\\d{7,8}(-\\d{1,4})?$";

    /**
     * 中国电信号码格式验证 手机段： 133,153,180,181,189,177,1700
     * **/
    private static final String CHINA_TELECOM_PATTERN = "(^1(33|53|77|8[019])\\d{8}$)|(^1700\\d{7}$)";

    /**
     * 中国联通号码格式验证 手机段：130,131,132,155,156,185,186,145,176,1709
     * **/
    private static final String CHINA_UNICOM_PATTERN = "(^1(3[0-2]|4[5]|5[56]|7[6]|8[56])\\d{8}$)|(^1709\\d{7}$)";

    /**
     * 中国移动号码格式验证
     * 手机段：134,135,136,137,138,139,150,151,152,157,158,159,182,183,184
     * ,187,188,147,178,1705
     * **/
    private static final String CHINA_MOBILE_PATTERN = "(^1(3[4-9]|4[7]|5[0-27-9]|7[8]|8[2-478])\\d{8}$)|(^1705\\d{7}$)";

    /**
     * 验证手机号码
     *
     * 移动号码段:139、138、137、136、135、134、150、151、152、157、158、159、182、183、187、188、147
     * 联通号码段:130、131、132、136、185、186、145
     * 电信号码段:133、153、180、189
     *
     * @param cellphone
     * @return
     */
    public static boolean checkCellphone(String cellphone) {
        String regex = "^((13[0-9])|(14[5|7])|(15([0-3]|[5-9]))|(18[0,5-9]))\\d{8}$";
        Pattern p = Pattern.compile(regex);
        Matcher matcher = p.matcher(cellphone);
        return matcher.matches();
    }

    /**
     * 验证11位数字的电话号码（最简单的判断）
     *
     * @param cellphone
     * @return
     */
    public static boolean checkSimplePhone(String cellphone){
        String regex = "^\\d{11}$";
        Pattern p = Pattern.compile(regex);
        Matcher matcher = p.matcher(cellphone);
        return matcher.matches();
    }

    /**
     * 验证固话号码
     *
     * @param telephone
     * @return
     */
    public static boolean checkTelephone(String telephone) {
        String regex = "^(0\\d{2}-\\d{8}(-\\d{1,4})?)|(0\\d{3}-\\d{7,8}(-\\d{1,4})?)$";
        Pattern p = Pattern.compile(regex);
        Matcher matcher = p.matcher(telephone);
        return matcher.matches();
    }

    /**
     * 验证电话号码的格式
     *
     * @author LinBilin
     * @param str
     *            校验电话字符串
     * @return 返回true,否则为false
     */
    public static boolean isPhoneCallNum(String str) {

        return str == null || str.trim().equals("") ? false : match(
                PHONE_CALL_PATTERN, str);
    }

    /**
     * 验证【电信】手机号码的格式
     *
     * @author LinBilin
     * @param str
     *            校验手机字符串
     * @return 返回true,否则为false
     */
    public static boolean isChinaTelecomPhoneNum(String str) {

        return str == null || str.trim().equals("") ? false : match(
                CHINA_TELECOM_PATTERN, str);
    }

    /**
     * 验证【联通】手机号码的格式
     *
     * @author LinBilin
     * @param str
     *            校验手机字符串
     * @return 返回true,否则为false
     */
    public static boolean isChinaUnicomPhoneNum(String str) {

        return str == null || str.trim().equals("") ? false : match(
                CHINA_UNICOM_PATTERN, str);
    }

    /**
     * 验证【移动】手机号码的格式
     *
     * @author LinBilin
     * @param str
     *            校验手机字符串
     * @return 返回true,否则为false
     */
    public static boolean isChinaMobilePhoneNum(String str) {

        return str == null || str.trim().equals("") ? false : match(
                CHINA_MOBILE_PATTERN, str);
    }


    /**
     * 验证手机和电话号码的格式
     *
     * @author LinBilin
     * @param str
     *            校验手机字符串
     * @return 返回true,否则为false
     */
    public static boolean isPhoneNum(String str) {
        // 如果字符串为空，直接返回false
        if (str == null || str.trim().equals("")) {
            return false;
        } else {
            int comma = str.indexOf(",");// 是否含有逗号
            int caesuraSign = str.indexOf("、");// 是否含有顿号
            int space = str.trim().indexOf(" ");// 是否含有空格
            if (comma == -1 && caesuraSign == -1 && space == -1) {
                // 如果号码不含分隔符,直接验证
                str=str.trim();
                return (isPhoneCallNum(str) || isChinaTelecomPhoneNum(str)
                        || isChinaUnicomPhoneNum(str) || isChinaMobilePhoneNum(str)) ? true
                        : false;
            } else {
                // 号码含分隔符,先把分隔符统一处理为英文状态下的逗号
                if (caesuraSign != -1) {
                    str=str.replaceAll("、", ",");
                }
                if (space != -1) {
                    str=str.replaceAll(" ", ",");
                }

                String[] phoneNumArr = str.split(",");
                //遍历验证
                for (String temp : phoneNumArr) {
                    temp=temp.trim();
                    if (isPhoneCallNum(temp) || isChinaTelecomPhoneNum(temp)
                            || isChinaUnicomPhoneNum(temp)
                            || isChinaMobilePhoneNum(temp)) {
                        continue;
                    } else {
                        return false;
                    }
                }
                return true;
            }

        }

    }

    /**
     * 执行正则表达式
     *
     * @param pat
     *            表达式
     * @param str
     *            待验证字符串
     * @return 返回true,否则为false
     */
    private static boolean match(String pat, String str) {
        Pattern pattern = Pattern.compile(pat);
        Matcher match = pattern.matcher(str);
        return match.find();
    }

    public static void main(String[] args) {
        String mobile="13544446a89";
        System.out.println(checkSimplePhone(mobile));
        System.out.println(isPhoneNum("13544446a89"));
    }

}
